# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s
# Hexagon Programmer's Reference Manual 11.10.8 XTYPE/SHIFT

# Shift by immediate
0x10 0xdf 0x14 0x80
# CHECK: r17:16 = asr(r21:20,#31)
0x30 0xdf 0x14 0x80
# CHECK: r17:16 = lsr(r21:20,#31)
0x50 0xdf 0x14 0x80
# CHECK: r17:16 = asl(r21:20,#31)
0x11 0xdf 0x15 0x8c
# CHECK: r17 = asr(r21,#31)
0x31 0xdf 0x15 0x8c
# CHECK: r17 = lsr(r21,#31)
0x51 0xdf 0x15 0x8c
# CHECK: r17 = asl(r21,#31)

# Shift by immediate and accumulate
0x10 0xdf 0x14 0x82
# CHECK: r17:16 -= asr(r21:20,#31)
0x30 0xdf 0x14 0x82
# CHECK: r17:16 -= lsr(r21:20,#31)
0x50 0xdf 0x14 0x82
# CHECK: r17:16 -= asl(r21:20,#31)
0x90 0xdf 0x14 0x82
# CHECK: r17:16 += asr(r21:20,#31)
0xb0 0xdf 0x14 0x82
# CHECK: r17:16 += lsr(r21:20,#31)
0xd0 0xdf 0x14 0x82
# CHECK: r17:16 += asl(r21:20,#31)
0x11 0xdf 0x15 0x8e
# CHECK: r17 -= asr(r21,#31)
0x31 0xdf 0x15 0x8e
# CHECK: r17 -= lsr(r21,#31)
0x51 0xdf 0x15 0x8e
# CHECK: r17 -= asl(r21,#31)
0x91 0xdf 0x15 0x8e
# CHECK: r17 += asr(r21,#31)
0xb1 0xdf 0x15 0x8e
# CHECK: r17 += lsr(r21,#31)
0xd1 0xdf 0x15 0x8e
# CHECK: r17 += asl(r21,#31)
0x4c 0xf7 0x11 0xde
# CHECK: r17 = add(#21,asl(r17,#23))
0x4e 0xf7 0x11 0xde
# CHECK: r17 = sub(#21,asl(r17,#23))
0x5c 0xf7 0x11 0xde
# CHECK: r17 = add(#21,lsr(r17,#23))
0x5e 0xf7 0x11 0xde
# CHECK: r17 = sub(#21,lsr(r17,#23))

# Shift by immediate and add
0xf1 0xd5 0x1f 0xc4
# CHECK: r17 = addasl(r21,r31,#7)

# Shift by immediate and logical
0x10 0xdf 0x54 0x82
# CHECK: r17:16 &= asr(r21:20,#31)
0x30 0xdf 0x54 0x82
# CHECK: r17:16 &= lsr(r21:20,#31)
0x50 0xdf 0x54 0x82
# CHECK: r17:16 &= asl(r21:20,#31)
0x90 0xdf 0x54 0x82
# CHECK: r17:16 |= asr(r21:20,#31)
0xb0 0xdf 0x54 0x82
# CHECK: r17:16 |= lsr(r21:20,#31)
0xd0 0xdf 0x54 0x82
# CHECK: r17:16 |= asl(r21:20,#31)
0x30 0xdf 0x94 0x82
# CHECK: r17:16 ^= lsr(r21:20,#31)
0x50 0xdf 0x94 0x82
# CHECK: r17:16 ^= asl(r21:20,#31)
0x11 0xdf 0x55 0x8e
# CHECK: r17 &= asr(r21,#31)
0x31 0xdf 0x55 0x8e
# CHECK: r17 &= lsr(r21,#31)
0x51 0xdf 0x55 0x8e
# CHECK: r17 &= asl(r21,#31)
0x91 0xdf 0x55 0x8e
# CHECK: r17 |= asr(r21,#31)
0xb1 0xdf 0x55 0x8e
# CHECK: r17 |= lsr(r21,#31)
0xd1 0xdf 0x55 0x8e
# CHECK: r17 |= asl(r21,#31)
0x31 0xdf 0x95 0x8e
# CHECK: r17 ^= lsr(r21,#31)
0x51 0xdf 0x95 0x8e
# CHECK: r17 ^= asl(r21,#31)
0x48 0xff 0x11 0xde
# CHECK: r17 = and(#21,asl(r17,#31))
0x4a 0xff 0x11 0xde
# CHECK: r17 = or(#21,asl(r17,#31))
0x58 0xff 0x11 0xde
# CHECK: r17 = and(#21,lsr(r17,#31))
0x5a 0xff 0x11 0xde
# CHECK: r17 = or(#21,lsr(r17,#31))

# Shift right by immediate with rounding
0xf0 0xdf 0xd4 0x80
# CHECK: r17:16 = asr(r21:20,#31):rnd
0x11 0xdf 0x55 0x8c
# CHECK: r17 = asr(r21,#31):rnd

# Shift left by immediate with saturation
0x51 0xdf 0x55 0x8c
# CHECK: r17 = asl(r21,#31):sat

# Shift by register
0x10 0xdf 0x94 0xc3
# CHECK: r17:16 = asr(r21:20,r31)
0x50 0xdf 0x94 0xc3
# CHECK: r17:16 = lsr(r21:20,r31)
0x90 0xdf 0x94 0xc3
# CHECK: r17:16 = asl(r21:20,r31)
0xd0 0xdf 0x94 0xc3
# CHECK: r17:16 = lsl(r21:20,r31)
0x11 0xdf 0x55 0xc6
# CHECK: r17 = asr(r21,r31)
0x51 0xdf 0x55 0xc6
# CHECK: r17 = lsr(r21,r31)
0x91 0xdf 0x55 0xc6
# CHECK: r17 = asl(r21,r31)
0xd1 0xdf 0x55 0xc6
# CHECK: r17 = lsl(r21,r31)
0xf1 0xdf 0x8a 0xc6
# CHECK: r17 = lsl(#21,r31)

# Shift by register and accumulate
0x10 0xdf 0x94 0xcb
# CHECK: r17:16 -= asr(r21:20,r31)
0x50 0xdf 0x94 0xcb
# CHECK: r17:16 -= lsr(r21:20,r31)
0x90 0xdf 0x94 0xcb
# CHECK: r17:16 -= asl(r21:20,r31)
0xd0 0xdf 0x94 0xcb
# CHECK: r17:16 -= lsl(r21:20,r31)
0x10 0xdf 0xd4 0xcb
# CHECK: r17:16 += asr(r21:20,r31)
0x50 0xdf 0xd4 0xcb
# CHECK: r17:16 += lsr(r21:20,r31)
0x90 0xdf 0xd4 0xcb
# CHECK: r17:16 += asl(r21:20,r31)
0xd0 0xdf 0xd4 0xcb
# CHECK: r17:16 += lsl(r21:20,r31)
0x11 0xdf 0x95 0xcc
# CHECK: r17 -= asr(r21,r31)
0x51 0xdf 0x95 0xcc
# CHECK: r17 -= lsr(r21,r31)
0x91 0xdf 0x95 0xcc
# CHECK: r17 -= asl(r21,r31)
0xd1 0xdf 0x95 0xcc
# CHECK: r17 -= lsl(r21,r31)
0x11 0xdf 0xd5 0xcc
# CHECK: r17 += asr(r21,r31)
0x51 0xdf 0xd5 0xcc
# CHECK: r17 += lsr(r21,r31)
0x91 0xdf 0xd5 0xcc
# CHECK: r17 += asl(r21,r31)
0xd1 0xdf 0xd5 0xcc
# CHECK: r17 += lsl(r21,r31)

# Shift by register and logical
0x10 0xdf 0x14 0xcb
# CHECK: r17:16 |= asr(r21:20,r31)
0x50 0xdf 0x14 0xcb
# CHECK: r17:16 |= lsr(r21:20,r31)
0x90 0xdf 0x14 0xcb
# CHECK: r17:16 |= asl(r21:20,r31)
0xd0 0xdf 0x14 0xcb
# CHECK: r17:16 |= lsl(r21:20,r31)
0x10 0xdf 0x54 0xcb
# CHECK: r17:16 &= asr(r21:20,r31)
0x50 0xdf 0x54 0xcb
# CHECK: r17:16 &= lsr(r21:20,r31)
0x90 0xdf 0x54 0xcb
# CHECK: r17:16 &= asl(r21:20,r31)
0xd0 0xdf 0x54 0xcb
# CHECK: r17:16 &= lsl(r21:20,r31)
0x10 0xdf 0x74 0xcb
# CHECK: r17:16 ^= asr(r21:20,r31)
0x50 0xdf 0x74 0xcb
# CHECK: r17:16 ^= lsr(r21:20,r31)
0x90 0xdf 0x74 0xcb
# CHECK: r17:16 ^= asl(r21:20,r31)
0xd0 0xdf 0x74 0xcb
# CHECK: r17:16 ^= lsl(r21:20,r31)
0x11 0xdf 0x15 0xcc
# CHECK: r17 |= asr(r21,r31)
0x51 0xdf 0x15 0xcc
# CHECK: r17 |= lsr(r21,r31)
0x91 0xdf 0x15 0xcc
# CHECK: r17 |= asl(r21,r31)
0xd1 0xdf 0x15 0xcc
# CHECK: r17 |= lsl(r21,r31)
0x11 0xdf 0x55 0xcc
# CHECK: r17 &= asr(r21,r31)
0x51 0xdf 0x55 0xcc
# CHECK: r17 &= lsr(r21,r31)
0x91 0xdf 0x55 0xcc
# CHECK: r17 &= asl(r21,r31)
0xd1 0xdf 0x55 0xcc
# CHECK: r17 &= lsl(r21,r31)

# Shift by register with saturation
0x11 0xdf 0x15 0xc6
# CHECK: r17 = asr(r21,r31):sat
0x91 0xdf 0x15 0xc6
# CHECK: r17 = asl(r21,r31):sat

# Vector shift halfwords by immediate
0x10 0xc5 0x94 0x80
# CHECK: r17:16 = vasrh(r21:20,#5)
0x30 0xc5 0x94 0x80
# CHECK: r17:16 = vlsrh(r21:20,#5)
0x50 0xc5 0x94 0x80
# CHECK: r17:16 = vaslh(r21:20,#5)

# Vector arithmetic shift halfwords with round
0x10 0xc5 0x34 0x80
# CHECK: r17:16 = vasrh(r21:20,#5):raw

# Vector arithmetic shift halfwords with saturate and pack
0x91 0xc5 0x74 0x88
# CHECK: r17 = vasrhub(r21:20,#5):raw
0xb1 0xc5 0x74 0x88
# CHECK: r17 = vasrhub(r21:20,#5):sat

# Vector shift halfwords by register
0x10 0xdf 0x54 0xc3
# CHECK: r17:16 = vasrh(r21:20,r31)
0x50 0xdf 0x54 0xc3
# CHECK: r17:16 = vlsrh(r21:20,r31)
0x90 0xdf 0x54 0xc3
# CHECK: r17:16 = vaslh(r21:20,r31)
0xd0 0xdf 0x54 0xc3
# CHECK: r17:16 = vlslh(r21:20,r31)

# Vector shift words by immediate
0x10 0xdf 0x54 0x80
# CHECK: r17:16 = vasrw(r21:20,#31)
0x30 0xdf 0x54 0x80
# CHECK: r17:16 = vlsrw(r21:20,#31)
0x50 0xdf 0x54 0x80
# CHECK: r17:16 = vaslw(r21:20,#31)

# Vector shift words by register
0x10 0xdf 0x14 0xc3
# CHECK: r17:16 = vasrw(r21:20,r31)
0x50 0xdf 0x14 0xc3
# CHECK: r17:16 = vlsrw(r21:20,r31)
0x90 0xdf 0x14 0xc3
# CHECK: r17:16 = vaslw(r21:20,r31)
0xd0 0xdf 0x14 0xc3
# CHECK: r17:16 = vlslw(r21:20,r31)

# Vector shift words with truncate and pack
0x51 0xdf 0xd4 0x88
# CHECK: r17 = vasrw(r21:20,#31)
0x51 0xdf 0x14 0xc5
# CHECK: r17 = vasrw(r21:20,r31)
